package Reflect.MyReflect003;

import java.lang.reflect.Field;

/**
 * ClassName:MyReflect
 * Package:Reflect.MyReflect003
 * Description:
 *
 * @Author:ZhangXin
 * @Create:2023/3/8-20:39
 * @Version:v1.0
 */
public class MyReflect {
    /*Class类中用于获取成员变量的方法
    * Field[] getFields(): 返回所有公共成员变量对象的数组
    * Field[] getDeclaredFields(): 返回所有成员变量对象的数组
    * Field getField(String name); 返回单个公共成员变量对象
    * Field getDeclaredField(String name): 返回单个成员变量对象
    *
    * Field类中用于创建对象的方法
    *   void set(Object obj,object value)：赋值
    *   Object get(Object obj)  获取值*/
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //获取class字节码文件对象
        Class clazz = Class.forName("Reflect.MyReflect003.Student");

        //获取成员变量方法
        //Field[] getFields(): 返回所有公共成员变量对象的数组
//        Field[] fields = clazz.getFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }
        //Field[] getDeclaredFields(): 返回所有成员变量对象的数组
//        Field[] declaredFields = clazz.getDeclaredFields();
//        for (Field declaredField : declaredFields) {
//            System.out.println(declaredField);
//        }

        //Field getField(String name); 返回单个公共成员变量对象
        Field gender = clazz.getField("gender");
        System.out.println(gender);

        Field name = clazz.getDeclaredField("name");
        System.out.println(name);

        //获取权限修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);

        //获取成员变量名字
        String n = name.getName();
        System.out.println(n);

        //获取成员变量的数据类型
        Class<?> type = name.getType();
        System.out.println(type);

        //获取成员变量的值
        Student stu = new Student("zs",23,"男");
        name.setAccessible(true);
        Object value = name.get(stu);
        System.out.println(value);

        //修改对象里面对应的值
        name.set(stu,"lizi");
        System.out.println(stu);
    }
}
